#include "interrupt.h"
#include "aic.h"
#include "serial.h"
#include "timer.h"
#include "process.h"

/**
  * Die Funktion irq_base_handler() sichert die Register, brancht 
  * zur Interrupt Service Routine und stellt die Register am Ende wieder her
  */
extern void base_irq_handler();
extern void base_swi_handler();

/**
 * Setzt AIC und Timer zurück, der dann von vorne zählt und nach Ablauf ein
 * neuen Interrupt auslöst.
 */
static void reset_timer_interrupt();

void service_sys_interrupt()
{
  jiffies++;
  reset_timer_interrupt();
  if(current_process() && --current_process()->time_slice > 0)
        return;

   do_context_switch();
}

static void reset_timer_interrupt()
{
    signal_end_of_interrupt(); // Interrupt disable in AIC
    has_timer_raised_interrupt(); // find cause of interrupt and set System Timer
}

void do_context_switch()
{
    write("!\n\r");
    reschedule();
}

